﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ElectronicCommerce.Framework.ServiceModel
{
    /// <summary>
    /// 表示一个服务代理。
    /// </summary>
    public interface IServiceBroker : IServiceProvider
    {
        /// <summary>
        /// 获取服务。
        /// </summary>
        /// <typeparam name="T">代表服务接口类型。</typeparam>
        /// <returns>服务。</returns>
        /// <remarks>
        /// 如果一个服务接口有多个实现，那么将获取以typeof(T)和type(T).Name唯一限定的服务。
        /// </remarks>
        T GetService<T>() where T : class;

        /// <summary>
        /// 获取服务。
        /// </summary>
        /// <typeparam name="T">代表要返回的服务接口类型。</typeparam>
        /// <param name="serviceType">要获取的服务类型。</param>
        /// <returns>类型为 <typeparamref name="T"/> 的服务。</returns>
        /// <remarks>
        /// 如果一个服务接口有多个实现，那么将获取以typeof(T)和type(T).Name唯一限定的服务。
        /// <typeparamref name="T"/> 可能为 <paramref name="serviceType"/> 的基类型。
        /// </remarks>
        // T GetService<T>(Type serviceType) where T : class;

        /// <summary>
        /// 获取以typeof(T)和serviceName唯一限定的服务。
        /// </summary>
        /// <typeparam name="T">代表服务接口类型。</typeparam>
        /// <param name="serviceName">服务名称。</param>
        /// <returns>服务。</returns>
        /// <remarks>
        /// 类型 <typeparamref name="T"/> 下对应的实现 <paramref name="serviceName"/> 是唯一的。
        /// 但对于全局来讲，不是唯一的。
        /// </remarks>
        T GetService<T>(string serviceName) where T : class;

        /// <summary>
        /// 获取以serviceType和serviceName唯一限定的服务。
        /// </summary>
        /// <param name="serviceName">服务名称。</param>
        /// <returns>服务。</returns>
        object GetService(Type serviceType, string serviceName);
    }
}
